perm filename JUSTX.OLD[NEW,LCS] blob sn#701970 filedate 1983-03-08 generic text, type T, neo UTF8
00100	C 2/18/83  ******** SUBROUTINE JUSTFY, FUNCTION OTHSID *************
00200		SUBROUTINE JUSTFY(JLP,ITEM,NPW,NO,RN,RSTFAC,R2,R4,R5)
00300	CX	SUBROUTINE JUSTFY(JLP,R,IR,NO,NP,RN,RSTFAC,R2,R4,R5,R6,R8,R9)
00400	COPYRIGHT 1983 BY LELAND SMITH
00500		COMMON/RINP/XPS(900),XPR(300)
00600		COMMON /JST/ N,XP(300),XPL(300)
00700		DIMENSION RN(1),NO(1),RSTFAC(0/1),NPW(1)
00800	C JLP= TOP STAFF NUM.
00900	C R2=THIS STAFF NUM.  R4=LEFT EDGE, R5=RIGHT EDGE.
01000	
01100		RJLP=JLP
01200		N=1
01300		DO 200 K=1,ITEM
01400		L=NPW(K)
01500		RL=RN(L)
01600	C  RL=WDCNT-2
01700		RA=RN(L+1)
01800	C  RA=CODE NUM.
01900		RR3=RN(L+3)
02000	C  RR3=POSITION(P3)
02100		IF(RR3+0.1.LT.R4.OR.RR3.GT.R5)GO TO 200
02200	C JUMP IF ITEM NOT IN BOUNDS
02300		IF(RA.GT.4.0.AND.RA.LT.17.0)GO TO 200
02400	C LOOKS AT NOTES, RESTS, CLEFS, BARS, KSIG, METER
02500		RR2=RN(L+2)
02600	C  RR2=STAFF NUM. OF THIS ITEM
02700		IF(RR2.NE.R2.AND.R2.LE.RJLP)GO TO 200
02800	C  THIS STAFF? OR LOOK AT ALL STAVES.
02900		RY=1.
03000	C BASIC SIZE FACTOR
03100		PL=0
03200		RR5=RN(L+5)
03300	C  RR5=PARAM 5    RR6=P6   RW=P4 
03400		RR6=RN(L+6)
03500	78	RR4=RN(L+4)
03600	C  RR4=HEIGHT-MINI(P4)
03700		M=RA
03800		GO TO(1,2,3,4)M     
03900	C  LOOKS AT NOTES,RESTS,CLEFS,BAR LINES,KSIGS,METERS.
04000	
04100		IF(M.EQ.18)GO TO 18
04200		GO TO 17
04300	
04400	C***** NOTES ******
04500	1	IF(RL.GE.7.0.AND.RN(L+9).LT.0)GO TO 200
04600	C  IF P9<0 IGNORE THIS NOTE.
04700		RR7=RN(L+7)
04800	C RR7=P7  DOTS, TAILS
04900		RC=ABS(RR4)
05000		RR4=AMOD(RR4,100.0)
05100		IF(RR4.GT.80.0)RR4=RR4-100.0
05200		IF(RC.LT.80.)GO TO 19
05300		IF(RC.LT.180.)RY=.6
05400	C  FOUND A MINI-NOTE
05500	
05600	CC19	PL=1.
05700	C SPACE NEEDED TO LEFT
05800	19	PR=3.5
05900	C SPACE NEEDED TO RIGHT
06000		PRR=0
06100	C STORES EXTRA SPACE TO RIGHT
06200		PLL=0
06300	C STORES EXTRA SPACE TO LFT
06400		
06500	CX	IF(RR4.LT.13.0.AND.RR4.GT.1.0)GO TO 10
06600	C IF LEDGER LINES ADD SPACE ON BOTH SIDES.
06700	CX	PR=4.0
06800	CX	PL=1.0
06900	10	IF(RR7.EQ.0)GO TO 12
07000	C TAIL ON NOTE?  (CHECK FOR HALF, WHOLE NOTES, RR6<0)
07100		RR=AMOD(RR7,10.0)
07200		IF(RR.LE.0.OR.RR6.LT.0)GO TO 11
07300		IF(RR5.LT.10.0.OR.RR5.GE.20.0)GO TO 11
07400	C SKIP IF NO STEM OR STEM DOWN
07500		PRR=1.5
07600	C ADD ROOM FOR TAIL
07700		
07800	11	KK=RR7/10
07900	CC	PX=2*KK
08000		PX=1.6*KK
08100	C SPACE FOR DOT(S)
08200		PX=PX+AMOD(RR7,1.0)*10.0
08300	C ADD SOME IF DOTS SPACED EXTRA TO RIGHT (E.G. 1.23=2.3 SPACES TO RT.)
08400		IF(PX.GT.PRR)PRR=PX
08500		IF(RR7.GE.10.0)GO TO 1012
08600	C NOTE HAS DOT, NO SPACE NEEDED FOR LEDGER LINE.
08700		IF(RR5.GE.10.0.AND.RR5.LT.20.0.AND.AMOD(RR7,10.0).GE.1.0)
08800		1 GO TO 1012
08900	C SKIP IF NOTE HAS TAIL ON STEM UP.
09000	12	 IF(PRR.GT.1.5)GO TO 1012
09100	C ALREADY ENOUGH SPACE FOR LEDGER LINE EXTENSION - SKIP NEXT
09200		JJ=0
09300	C NOW FIND NEXT CLOSEST NOTE TO RIGHT ON THIS STAFF.
09400		Z=10.0
09500		X=RR4-13.0
09600		DO 1000 M=1,ITEM
09700		J=NPW(M)
09800		IF(RN(J+1).NE.1.0)GO TO 1000
09900	C LOOK AT NOTES ONLY
10000		IF(RN(J+2).NE.RR2)GO TO 1000
10100	C THIS STAFF ONLY
10200		Y=RN(J+3)-RR3
10300		IF(Y.LE.0.OR.Y.GT.Z)GO TO 1000
10400		Z=Y
10500		JJ=J
10600	1000	CONTINUE
10700		IF(Z.GE.10.0)GO TO 1012
10800		IF(AMOD(RN(JJ+5),10.0).GE.1.0)GO TO 1012
10900	C SKIP IF NEXT NOTE HAS ACCI. IN FRONT.
11000		Z=AMOD(RN(JJ+4),100.0)
11100	C GET HEIGHT OF NOTE
11200		IF(X.GE.0)GO TO 1001
11300	C SKIP IF 1ST NOTE IS ABOVE STAFF 
11400		IF(Z.GE.1.0)GO TO 1002
11500		GO TO 1012
11600	1001	IF(Z.LT.13.0)GO TO 1012
11700	C SKIP IF NEXT NOTE BELOW STAFF
11800	1002	PRR=1.5
11900	C ADD 1. SO LEDGER LINES DON'T BUMP
12000	
12100	1012	RR=AMOD(RR5,10.0)
12200	C ANY ACCIDENTALS?
12300		IF(RR.EQ.0)GO TO 13
12400		PLL=3.0
12500		IF(IFIX(RR).EQ.5)PLL=5.0
12600	C RR=5 = DOUBLE FLAT
12700		PLL=PLL+AMOD(RR5,1.0)*10.0
12800	C INCREASE IF ACCI. SPACED TO LEFT. (E.G. 12.21 =2.1 SPACES TO LEFT)
12900	
13000	13	IF(RR6.EQ.0)GO TO 14
13100	C LOOK FOR HALF NOTES, WHOLE NOTES, NOTES ON WRONG SIDE OF STEM.
13200		KK=0
13300		IF(RR6.GT.0)GO TO 130
13400	C NOW IT'S A WHITE NOTE
13500		PR=3.9
13600	C 3.9=MINIMUM SPACE FOR HALFNOTE
13700		KK=IFIX(AMOD(RR7,10.0))
13800	C GET RT. DIGIT IN P7
13900		IF(KK.EQ.1)PR=4.3
14000		IF(KK.EQ.2)PR=4.8
14100	C =1=WHOLENOTE, =2=DOUBLE WHOLENOTE
14200		IF(RR6.GT.-10.0)GO TO 14
14300	C NOW NOTE ON WRONG SIDE OF STEM
14400	130	AR=2.5
14500		IF(KK.EQ.1)AR=3.0
14600		IF(KK.EQ.2)AR=3.5
14700		IF(ABS(RR6).GE.20.0)GO TO 135
14800	C NOW NOTE TO RIGHT OF STEM
14900		PRR=PRR+AR
15000		GO TO 14
15100	135	PLL=PLL+AR
15200	C ADD SPACE TO LEFT IF NOTE ON LEFT SIDE OF STEM
15300	
15400	14    	PR=(PR+PRR)*RY
15500		PL=(PL+PLL)*RY
15600		
15700		IF(RL.LT.8)GO TO 700
15800	C JUMP IF THERE IS NOT P10 TO LOOK AT
15900		RR2=RR2+1
16000	CC	RW=RN(L+10)
16100	C PUT P10 INTO RW
16200		IF(RN(L+10).GE.2.0)RR2=RR2-2.
16300	C NOW STAFF # IS SET TO WHERE NOTE REALLY IS.
16400		GO TO 700
16500	
16600	C***** RESTS *****
16700	2	IF(RL.GE.4.0.AND.RR6.LT.0)GO TO 200
16800		IF(RL.GE.5.0.AND.RR7.LT.0)GO TO 200
16900	C SKIP INVISIBILE RESTS AND RESTS WITH NEG. RHY.
17000		IF(RL.GE.6.0.AND.RR8.NE.0)GO TO 200
17100	C RR8<0=CENTERED WHOLE REST - ASSUMES NO NEED TO JUSTIFY.
17200		PR=3.0
17300		IF(RL.GE.5.0)PR=PR+RR6*2.0
17400	C RR6=DOTS
17500	CC	PL=1.0
17600		GO TO 700
17700		
17800	3	IF(RL.LT.3)GO TO 30
17900	C  <3 MEANS NOTHING IN R5
18000		IF(RR5.GT.4)GO TO 200
18100	C  NOT A REAL CLEF IF >4 (0=TREB, 1=BASS, 2=ALT, 3=TEN, 4=PERC.)
18200	30	IF(RL.GE.2.AND.RR4.GE.100.0)RY=.85
18300		PR=6.5*RY
18400		GO TO 700
18500	
18600	4	IF(RL.GT.3.OR.RR4.LT.0)GO TO 200
18700	C IF P4.LT.0 THEN IT'S AN INVISIBLE BAR.
18800	CC  FOR REPEAT BAR WDCNT IS 3 -- 10/77 444	IF(RL.GT.2)GO TO 2
18900	C  SHOULD CHECK ON BAR LINES NO MATTER WHICH STAFF
19000		PL=0.5
19100		PR=1.
19200	C PL=SPACE NEEDED TO LEFT, PR=SPACE NEEDED TO RIGHT, RR3=POS. OF ITEM
19300		KX=RR4/1000.
19400		IF(KX.LE.0.)GO TO 40
19500		PL=3.2
19600	C  ADD A LITTLE SPACE IN FRONT OF DBL BAR.
19700		IF(KX.EQ.2.OR.KX.EQ.4)PR=6.0
19800	C KX=2=DOTS TO RIGHT
19900		IF(KX.GT.2)PL=4.2
20000	C KX>2=DOTS TO LEFT
20100	CC	IF(RL.LT.3)GO TO 700
20200	C JUMP IF THIN DBL BAR. OLD DBL BAR HAS 1 IN R5.
20300	CC229	IF(KX.NE.2)PR=PR+PR
20400	C 2=DOTS TO RT. 1 OR 4=DOTS TO LFT. 3=DOTS ON BOTH SIDES.
20500	C  REPT BAR WITH DOTS TO LEFT.  ADD SPACE IN FRONT OF IT.
20600	CC	PL=-PL/RBX
20700	CC	IF(KX.EQ.4)KX=0
20800	CC129	IF(KX.GE.2)PL=RBZ*PL
20900	C  IF DOTS TO RIGHT ADD MORE SPACE AFTER REPT BAR.
21000		GO TO 700
21100	40	Z=999.
21200	C FIND NEXT CLOSEST ITEM.
21300		DO 41 M=1,ITEM
21400		J=NPW(M)
21500		IF(R2.LE.RJLP.AND.R2.NE.RN(J+2))GO TO 41
21600	C SKIP IF NOT ON RIGHT STAFF
21700		X=RN(J+3)
21800		IF(X.GT.Z.OR.X.LE.RR3)GO TO 41
21900		Z=RR3
22000		L=J
22100	C SAVE POS. AND CODE NUM.
22200	41	CONTINUE
22300		IF(RN(L+1).LE.2.0)PR=PR+1.5
22400	C IF A NOTE OR REST, ADD 1.5 TO SPACE
22500		GO TO 700
22600	
22700	C KSIG  
22800	17	RR5=ABS(RR5)
22900		IF(RR5.GE.100)RR5=RR5-100
23000	C  +100 FOR NATURALS AS KEYSIG.
23100		PR=0.5+2.1*(RR5-1)
23200	C  SPACES FOR CORRECT NUM OF ACCIS.  RR5=NUM OF ACCIS.
23300		PL=3.0
23400		GO TO 700
23500	
23600	C METER
23700	18	RC=0
23800		IF(RL.GE.7)RC=9
23900	C FOR COMPOSITE METERS. NO CHECK FOR DBL DIGITS YET.
24000		PR=3.5
24100		PL=1.0
24200		IF(RR6.LE.9.AND.RR5.LE.9)GO TO 180
24300	C  CHECKS FOR 2-DIGIT METERS
24400		PR=5.5
24500		PL=2.0
24600	180	PR=PR+RC
24700	700	CALL ROOM(RR3,PL,PR,RR2,R4,R5,RSTFAC)
24800	C    RR3=POS.,PL=NEED TO LEFT,PR=NEED TO RIGHT, RR2=STAFF#
24900	200	CONTINUE
25000		CALL JSORT(NO,R2,R4,R5,RN)
25100	300	END
25200	
25300		SUBROUTINE ROOM(RB,RL,RR,STAF,R4,R5,RSTFAC)
25400	C SETS UP ARRAYS CONTAINING ALL NEEDED SPACE INFO
25500		COMMON /RINP/PS(900),PR(300)
25600		COMMON /JST/ N,P(300),PL(300)
25700	C SHARE THESE ARRAYS WITH SOME OTHERS??? (RINP?)
25800		DIMENSION RSTFAC(0/1)
25900		P(N)=0
26000		PL(N)=0
26100		PR(N)=0
26200		PS(N)=-1
26300	C ZERO OUT NEXT ARRAY SLOTS
26400		IF(ABS(RB-R4).LE.0.1)RL=0
26500		IF(ABS(RB-R5).LE.0.1)RR=0
26600	CHECK TO SEE IF ITEM IS AT LEFT OR RIGHT EDGE OF JUSTIFY AREA.
26700		K=STAF
26800		S=RSTFAC(K)
26900	C GET PROPER SIZE FACTOR FOR THIS STAFF
27000		RL=RL*S
27100		RR=RR*S
27200		DO 1 K=1,N-1
27300		IF(ABS(RB-P(K)).GT.0.1)GO TO 1
27400	C SAME POSITION?
27500		IF(RB.LT.P(K))P(K)=RB
27600	C USE POSITION FARTHEST TO LEFT
27700		IF(STAF.NE.PS(K))GO TO 1
27800	C SAME STAFF?
27900		IF(PR(K).LT.RR)PR(K)=RR
28000		IF(PL(K).LT.RL)PL(K)=RL
28100	C ITEM IN SAME POS.  CHANGE SPACE REQUIREMENTS IF NECESSARY.
28200		RETURN
28300	1	CONTINUE
28400		P(N)=RB
28500		PR(N)=RR
28600		PL(N)=RL
28700		PS(N)=STAF
28800		N=N+1
28900	C PUT AWAY MORE SPACE NEEDS.
29000		END
29100	
29200		SUBROUTINE JSORT(NO,R2,R4,R5,RN)
29300		DIMENSION NO(1),RN(1)
29400		COMMON /RINP/PS(900),PR(300)
29500	C PS HAS 900 SO THERE IS ROOM FOR "NO" ARRAY (CHANGE THIS LATER?)
29600		COMMON /JST/ N,P(300),PL(300)
29700		P(N)=9999.
29800		N=N-1
29900		K=1
30000	2	A=P(K)
30100		M=K+1
30200		KK=K
30300		DO 1 L=M,N
30400		B=ABS(P(L)-A)
30500		IF(B.GT.0.1)GO TO 6
30600		P(L)=A
30700	C SAME POS.
30800		GO TO 1
30900	6	IF(P(L).GT.A)GO TO 1
31000	C FIND ITEM FURTHEST TO LEFT
31100		A=P(L)
31200		K=L
31300	1	CONTINUE
31400	10	IF(K.EQ.KK)GO TO 3
31500		B=PR(K)
31600		C=PL(K)
31700		D=PS(K)
31800		DO 4 L=K,KK+1,-1
31900	C SHUFFLE ARRAYS
32000		LL=L-1
32100		P(L)=P(LL)
32200		PL(L)=PL(LL)
32300		PR(L)=PR(LL)
32400	4	PS(L)=PS(LL)
32500	11	P(KK)=A
32600		PR(KK)=B
32700		PL(KK)=C
32800		PS(KK)=D
32900	3	K=KK+1
33000		IF(K.LE.N)GO TO 2
33100	
33200	C NOW COLLECT ALL SPACE IN PL ARRAY
33300		DO 20 K=2,N+1
33400		L=K-1
33500		IF(PS(K).NE.PS(L))GO TO 21
33600	C SAME STAFF?
33700		GO TO 23
33800	21	L=K-2
33900	22	IF(PS(L).EQ.PS(K))GO TO 23
34000		L=L-1
34100		IF(L.GT.0)GO TO 22
34200		GO TO 20
34300	23	PL(K)=PL(K)+PR(L)
34400	C FOUND PREVIOUS ITEM ON SAME STAFF.
34500	20	CONTINUE
34600	
34700	C NOW STORE POS  OF EACH PREV. ITEM ON SAME STAFF IN PR ARRAY.
34800		DO 40 K=2,N+1
34900		L=K-1
35000		IF(PS(K).NE.PS(L))GO TO 41
35100	C SAME STAFF?
35200		GO TO 43
35300	41	L=K-2
35400	42	IF(PS(L).EQ.PS(K))GO TO 43
35500		L=L-1
35600		IF(L.GT.0)GO TO 42
35700		PR(K)=R4
35800	C FAR LEFT POS. OF JUST. RANGE GOES INTO PS
35900		GO TO 40
36000	43	PR(K)=P(L)
36100	C FOUND PREVIOUS ITEM ON SAME STAFF.
36200	C STORE POS. OF PREVIOUS ITEM IN PR ARRAY.
36300	40	CONTINUE
36400		PR(1)=R4
36500	
36600	C NOW GET RID OF UNNEEDED DATA
36700		L=2
36800	30	LL=L-1
36900		IF(P(L).NE.P(LL))GO TO 36
37000	C NOW 2 ITEMS IN SAME POS. ON DIFF. STAVES
37100		IF(PR(L).EQ.PR(LL))GO TO 34
37200	C JUMP IF POS. OF PREV. ITEM IS SAME IN BOTH CASES.
37300		A=P(L)-PR(L)-PL(L)
37400		B=P(LL)-PR(LL)-PL(LL)
37500	C A,B = EXCESS SPACE AVAILABLE., KEEP THE ONE WITH THE LEAST.
37600		IF(B.GT.A)L=L-1
37700		GO TO 35
37800	34	IF(PL(L).GT.PL(LL))PL(LL)=PL(L)
37900	C EXCHANGE IF NEEDED SPACE HERE IS < PREVIOUS NEEDED
38000	35	N=N-1
38100	C DECREMENT COUNTER
38200	33	DO 32 K=L,N
38300	C CONTRACT ARRAY
38400		M=K+1
38500		PL(K)=PL(M)
38600		PR(K)=PR(M)
38700	32	P(K)=P(M)
38800		GO TO 9
38900	36	L=L+1
39000	9	IF(L.LE.N)GO TO 30
39100	 
39200	100	DO 101 K=1,N
39300	101	PS(K)=P(K)
39400	C PS WILL HOLD SHIFTED POINTS
39500		DO 50 J=1,50
39600	C "ACCORDEAN" LOOP - USUALLY EXITS WELL BEFORE 50
39700		Y=0
39800		DO 51 K=2,N
39900		A=PS(K)-PR(K)-PL(K)
40000	C NEG. MOVE REQUIREMENT
40100		IF(A.GE.-0.1)GO TO 51
40200	C SKIP IF ENOUGH SPACE
40300		Y=PS(K)
40400	C SHIFT ALL POINTS FOUND FROM HERE TO FAR RIGHT
40500		DO 52 L=K,N
40600		PS(L)=PS(L)-A
40700	52	IF(PR(L).GE.Y)PR(L)=PR(L)-A
40800		IF(PR(K).EQ.PS(K-1))GO TO 51
40900	C JUMP IF PREVIOUS ITEM ON SAME STAFF
41000	C NOW SHIFT OTHER STAVES' ITEMS FOUND TO LEFT
41100		Z=PR(K)
41200	C LOOK IN AREA BOUNDED BY Z AND Y
41300		F=(Y-Z-A)/(Y-Z)
41400	C SPACING FACTOR
41500		DO 53 L=1,N
41600		B=PS(L)
41700		IF(B.LT.Z.OR.B.GT.Y)GO TO 54
41800	C FOUND A POINT TO SHIFT
41900		B=B-Z
42000	C ACTUAL SPACE FROM LEFT LIMIT
42100		PS(L)=Z+B*F
42200	C LEFT LIMIT+SPACE*FACTOR
42300	54	B=PR(L)
42400		IF(B.LT.Z.OR.B.GT.Y)GO TO 53
42500		B=B-Z
42600		PR(L)=Z+B*F
42700	53	CONTINUE
42800	51	CONTINUE
42900		IF(PS(N).LE.R5)GO TO 203
43000	C MORE THAN ENOUGH SPACE EXISTS
43100	        IF(Y.EQ.0)GO TO 203
43200	C JUMP OUT IF NO POINTS MOVED
43300	      F=(R5-R4)/(PS(N)-R4)
43400	C FACTOR TO SHIFT ALL BACK WITHIN ORIGINAL LIMITS
43500	        DO 56 K=1,N
43600	        PS(K)=R4+(PS(K)-R4)*F
43700	56      PR(K)=R4+(PR(K)-R4)*F
43800	50    CONTINUE
43900	
44000	CQ NEXT WAS ATTEMPT TO REPLACE "ACCORDEAN" SYSTEM 3/83  (LABELS 101+1→50)
44100	CQ	GO TO 203
44200	CQ        DIMENSION PSX(300),PRR(300),PG(300)
44300	C GET NUM OF STAFF TO JUSTIFY
44400	CQ        DO 60 K=1,N
44500	C SAVE ALL DATA
44600	CQ        PSX(K)=PS(K)
44700	CQ        PRR(K)=PR(K)
44800	CQ60      PG(K)=PS(K)-PR(K)-PL(K)
44900	C PG ARRAY HAS VALUE OF ALL GAPS.
45000	CQ        J=0
45100	CQ61      T=0
45200	C T=TOTAL GAP SPACE AVAILABLE
45300	CQ        DO 62 K=1,N
45400	CQ        IF(PG(K).LE.0)GO TO 62
45500	C SKIP IF NO GAP IN FRONT OF THIS ITEM
45600	CQ        A=PR(K)
45700	C POS. OF PREVIOUS ITEM ON THAT STAFF
45800	CQ        B=PS(K)
45900	C POS OF THIS ITEM
46000	CQ        G=PG(K)
46100	C ADJUSTED GAP SIZE AVAILABLE
46200	CQ	IF(R2.LT.RJLP)GO TO 66
46300	CQ        GG=0
46400	CQ        DO 63 L=K+1,N
46500	C CHECK FOR K+1 > N
46600	CQ        IF(PS(L).LE.A.OR.PR(L).GE.B)GO TO 63
46700	C JUMP IF ITEM IS TO LEFT OF ITEM K OR PREV. IS TO RIGHT
46800	CQ        IF(PG(L).LE.0)GO TO 63
46900	C JUMP IF NO GAP HERE
47000	CQ        GG=PG(L)
47100	CQ	IF(PS(L)-GG.LT.PS(L-1))GG=PS(L)-PS(L-1)
47200	C GAP CAN BE NO GREATER THAN DIST TO PREV. ITEM ON OTHER STAFF
47300	CQ        IF(GG.LT.G)G=GG
47400	C FIND SMALLEST GAP
47500	CQ63      CONTINUE
47600	CQ        IF(GG.EQ.0)GO TO 62
47700	C JUMP IF NO GAPS WITHIN PROPER BOUNDS ARE FOUND
47800	CQ66      T=T+G
47900	C ADD UP TOTAL GAP SPACE
48000	CQ        DO 64 L=K,N
48100	C NOW SHIFT ALL ITEMS TO LEFT TO FILL IN SMALLEST GAP
48200	CQ        PS(L)=PS(L)-G
48300	CQ        IF(PR(L).GE.B)GO TO 65
48400	C SKIP IF PREV. ITEM IS OUT OF BOUNDS TO RIGHT
48500	CQ        PG(L)=PG(L)-G
48600	C DECREASE THE GAP SIZES
48700	CQ        GO TO 64
48800	CQ65      PR(L)=PR(L)-G
48900	C MOVE BACK POS. OF PREV. ITEM IF IN BOUNDS
49000	CQ64      CONTINUE
49100	CQ62      CONTINUE
49200	CQ        IF(J.NE.0)GO TO 203
49300	C J=-1 SECOND TIME THROUGH LOOP.
49400	CQ        IF(T.EQ.0)GO TO 70
49500	C JUMP IF NO FREE SPACE WAS FOUND
49600	CQ        X=(PSX(N)-R5)/T
49700	C EXTRA SPACE REDUCTION FACTOR
49800	CQ        IF(X.LT.1.0)GO TO 71
49900	C JUMP IF NOT ENOUGH ROOM WAS FOUND, USE PS AS IS.
50000	CQ70      X=(R5-R4)/(PS(N)-R4)
50100	C SHIFT ALL POINTS BY THIS FACTOR
50200	CQ        DO 75 L=1,N
50300	CQ        PS(L)=R4+(PS(L)-R4)*X
50400	CQ75      PR(L)=R4+(PR(L)-R4)*X
50500	CQ        GO TO 203
50600	CQ71      DO 72 L=1,N
50700	C GET BACK ORIGINAL DATA AND GO THRU LOOP AGAIN WITH FACTOR
50800	CQ        PS(L)=PSX(L)
50900	CQ        PR(L)=PRR(L)
51000	CQ72      PG(L)=(PS(L)-PR(L)-PL(L))*X
51100	CQ        J=-1
51200	CQ        GO TO 61
51300	
51400	C NOW PS(1) SHOULD BE >=R4, PS(N)<=R5.
51500	203	CALL MOVIT(RN,NO,R5,2000.0,1000.0,0.0)
51600	C MOVE ANYTHING TO RIGHT OF JUSTIFY AREA FAR TO RIGHT.
51700	CC CAN'T USE DO LOOP, FAIL PROG. WIPES OUT AC15.	DO 206 K=1,N
51800		CALL MOVIT(RN,NO,R4,R5,500.0,0.0)
51900	C NOW MOVE JUSTIFY AREA 500 TO RIGHT. LEAVES ROOM FOR EXPANSION, CONTRACTION.
52000		K=2
52100		L=1
52200	C A= AMOUNT MOVED LEFT OR RIGHT.
52300	206	CALL MOVIT(RN,NO,P(L)+500.0,P(K)+500.0,PS(L),PS(K))
52400	C MOVE OLD RANGE INTO NEW RANGE (AND SHIFT BACK 500)
52500		L=K
52600		K=K+1
52700		IF(K.LE.N)GO TO 206
52800		CALL MOVIT(RN,NO,R5+1000.0,3000.0,-1000.0,0.0)
52900	C MOVE BACK THINGS TO RIGHT OF JUSTIFY AREA.  NOW ALL DONE.
53000	300	END